package cxydmmszl.chapter08.t117;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

/**
 * <li style="color: red;">Prob</li>
 * "之" 字形打印矩阵
 * <li style="color: green;">Desc</li>
 * 给定一个矩阵 matrix，按照“之”字形的方式打印这个矩阵，如样例所示。
 * <li style="color: green;">Input</li>
 * 输入包含多行，第一行包含两个整数 n 和 m(1≤n,m≤200)，代表矩阵的行数和列数，
 * 接下来 n 行，每行 m 个整数，代表矩阵 matrix(1≤matrix[i][j]≤40000)。
 * <li style="color: green;">Output</li>
 * 输出一行 ，代表“之”字形输出的矩阵。
 * <li style="color: blue;">Link</li> CD151
 *
 * @author habitplus
 * @since 2021-10-09 14:00
 */
public class Main {
    static final StreamTokenizer st =
            new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    static int nextInt() {
        try {
            st.nextToken();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (int) st.nval;
    }

    private static void printMatrixZigZag(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return;
        }

        // 定义两个坐标，一个从(0,0)开始，一致往右走，走不下去再往下走；
        // 一个从(0,0)开始，一直往下走，走不下去再往右走
        int lr = 0, lc = 0;
        int br = 0, bc = 0;
        int row = matrix.length;
        int col = matrix[0].length;
        // 方向控制，开始从 (br, bc) -> (lr, lc)，即往右上打印
        boolean rtDir = true;
        StringBuilder sb = new StringBuilder();
        while (lr != row) { // 走到左下角就停止
            print(matrix, lr, lc, br, bc, rtDir, sb);
            lr = lc == col - 1 ? lr + 1 : lr;
            lc = lc == col - 1 ? lc : lc + 1;
            bc = br == row - 1 ? bc + 1 : bc;
            br = br == row - 1 ? br : br + 1;
            rtDir = !rtDir;
        }

        System.out.println(sb.toString());
    }

    private static void print(int[][] matrix, int lr, int lc, int br, int bc, boolean rtDir, StringBuilder res) {
        if (rtDir) {
            while (br != lr - 1) {
                res.append(matrix[br--][bc++]).append(' ');
            }
        } else {
            while (lr != br + 1) {
                res.append(matrix[lr++][lc--]).append(' ');
            }
        }
    }

    public static void main(String[] args) {
        int n = nextInt();
        int m = nextInt();
        int[][] matrix = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                matrix[i][j] = nextInt();
            }
        }

        printMatrixZigZag(matrix);
//        handle(matrix);
    }

    private static void handle(int[][] m) {
        if (m == null || m.length == 0 || m[0].length == 0) {
            return;
        }

        int i = 0, j = 0;
        int row = m.length;
        int col = m[0].length;
        int k = row + col - 1;
        // 初始时，往 右上 方向走
        boolean rt = true;
        StringBuilder sb = new StringBuilder();
        while (k-- > 0) {
            if (rt) {
                while (i >= 0 && j < col) {
                    // 往右上走
                    sb.append(m[i][j]).append(" ");
                    i--;
                    j++;
                }

                // 往右走一步，没有就往下走一步
                if (j < col) {
                    i++;
                } else {
                    j--;
                    i += 2;
                }
            } else {
                while (i < row && j >= 0) {
                    sb.append(m[i][j]).append(" ");
                    i++;
                    j--;
                }

                // 往下走一步，没有就往右走一步
                if (i < row) {
                    j++;
                } else {
                    i--;
                    j += 2;
                }
            }
            // 将方向改为 左下
            rt = !rt;
        }

        System.out.println(sb.toString());
    }
}
